package com.example.normaldemo.numberView;

import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PointFilter implements InputFilter {

    Pattern mPattern;

    //输入的最大金额
//    private static final int MAX_VALUE = Integer.MAX_VALUE;
    //小数点后的位数 精度
    private int mInputPrecision;

    private float mMaxValue;

    private static final String POINTER = ".";

    private static final String ZERO = "0";

    public PointFilter(int Precision, float maxValue) {
        this.mInputPrecision = Precision;
        this.mMaxValue = maxValue;
        mPattern = Pattern.compile("([0-9]|\\.)*");
    }


    /**
     * @param source 输入的文字
     * @param start  输入-0，删除-0
     * @param end    输入-文字的长度，删除-0
     * @param dest   原先显示的内容
     * @param dstart 输入-原光标位置，删除-光标删除结束位置
     * @param dend   输入-原光标位置，删除-光标删除开始位置
     * @return
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String sourceText = source.toString();
        String destText = dest.toString();
        //验证删除等按键
        if (TextUtils.isEmpty(sourceText)) {
            return "";
        }
        Matcher matcher = mPattern.matcher(source);
        //已经输入小数点的情况下，只能输入数字
        if (destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source)) {  //只能输入一个小数点
                    return "";
                }
            }
            //验证小数点精度，保证小数点后只能输入两位
            int index = destText.indexOf(POINTER);
            int length = destText.length() - index;
            //如果长度大于2，并且新插入字符在小数点之后
            if (length > mInputPrecision && index < dstart) {
                //超出2位返回null
                return "";
            }
        } else {
            //没有输入小数点的情况下 根据步长自动填充

            //没有输入小数点的情况下，只能输入小数点和数字，但首位不能输入小数点
            //如果输入非法字符（除了小数点和数字），就返回空字符串
            if (!matcher.matches()) {
                return "";
            } else {
                //在第一个字符就输入小数点
                if (((POINTER.equals(source)) || (ZERO.equals(source))) && TextUtils.isEmpty(destText)) {
                    return "0.";
                }
            }
        }

        //验证输入金额的大小
        double sumText = Double.parseDouble(destText + sourceText);
        //当前值已超过最大值
        if (sumText == mMaxValue && source.toString().equals(POINTER)) {
            return "";
        } else if (sumText > mMaxValue) {
            return dest.subSequence(dstart, dend);
        }
        return dest.subSequence(dstart, dend) + sourceText;
    }
}
